package q463_islandPerimeter;

public class Solution_1 {
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};

    public int islandPerimeter(int[][] grid) {

        int ans = 0;
        for (int i = 0; i < grid.length; ++i) {
            for (int j = 0; j < grid[0].length; ++j) {
                if (grid[i][j] == 1) {
                    ans += dfs(i, j, grid);
                    // 因为只有一个岛屿 搜索完毕即可退出循环
                    break;
                }
            }
        }
        return ans;
    }

    /*
    此时dfs的逻辑有所不同 因为dfs将会返回值
    终止条件在于
    1 遇到边界或者水 则+1 并return
    2 遇到已经统计过的块 则+0 并return
    3 否则是未统计的块 则将其置为2 并向四个方向搜索
     */
    public int dfs(int x, int y, int[][] grid) {
        if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0) {
            return 1;
        }
        if (grid[x][y] == 2) {
            return 0;
        }
        // 将该块重置为已经搜索——>2
        grid[x][y] = 2;
        // 注意每次都要刷新res为0来计算 否则会累加 实际上类似于695 定义一个全局变量也能达到类似效果
        int res = 0;
        // 向四个方向搜索
        for (int i = 0; i < 4; ++i) {
            int tx = x + dx[i];
            int ty = y + dy[i];
            res += dfs(tx, ty, grid);
        }
        return res;
    }

}
